from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import os
os.environ['PATH'] ="C:/Oracle/Client/bin" + os.pathsep +os.environ['PATH'] 
import cx_Oracle
import datetime,BaseHTTPServer
import threading
import thread
import time
import OpThread 
import smtplib 

server = SimpleXMLRPCServer(("localhost", 8000),allow_none = 1,
                            requestHandler=SimpleXMLRPCRequestHandler)
server.register_introspection_functions()#fonction qui enregistre le fait qu'il peut fournir cette fonction en reponse a qqchose
 


class ConnecteurDb(object):
    def __init__(self):
        self.connection = ""
        self.curseur= ""
        self.sqlString=""
        self.sqlData=[]
        
    def ouvrirConnection(self):
        self.connection = cx_Oracle.connect("b52equip4/tum7@titan")#klezman.selfip.org ou titan
        self.curseur=self.connection.cursor()
        
    def fermeConnection(self):
        self.curseur.close()
        self.connection.commit()
        self.connection.close()

    def sqlExecute(self,monsql):
        #print 'monsql:'+monsql
        self.curseur.execute(monsql)
        
class ControleurServeur:
    def __init__(self):
        self.DB = ConnecteurDb()
        self.reponse= "NOT QUERY"
        #ajouter cette ligne
        self.NosThread= NosThreads(self)
        self.modelS=ModeleServeur(self)
         
    def ouverture(self):
        self.DB.ouvrirConnection()
        return self.reponse
    
    def execute(self,chaine):
        self.DB.sqlExecute(chaine)
        self.reponse = self.DB.curseur.fetchall()
        return self.reponse
    
    def fermeture(self):
        self.DB.fermeConnection()
        return self.reponse    
    
    def comOracleNotQuery(self,chaine):
        self.DB.ouvrirConnection()
        self.DB.sqlExecute(chaine)
        self.DB.fermeConnection()
        return self.reponse
    
    def comOracleQuery(self,chaine):
        self.DB.ouvrirConnection()
        self.DB.sqlExecute(chaine)
        self.reponse = self.DB.curseur.fetchall()
        self.DB.fermeConnection()
        return self.reponse
    
    def preparerEmails(self,requeteSQL):
        #print "requ "+requeteSQL[1]
        reponseSQL=self.comOracleQuery(requeteSQL[1])
        reponseEmail=self.comOracleQuery("select email from emailsregles where idregle="+str(requeteSQL[0]))
        textEmail=self.modelS.emailFormatage(reponseSQL,requeteSQL[1])
        for i in range(len(reponseEmail)):
            self.modelS.send(textEmail, reponseEmail[i][0])
        
        

#ajouter cette classe   
class ModeleServeur(object):
    
    def __init__(self,parent):
        self.parent = parent
    def send(self,texte,destinataire,src = "projeterp@gmail.com", password = "projet12" ): 
   
        mail= "To: " + destinataire + "\nFrom: " + src+"\r\n"
        mail+= " Subject: Resultat regle\n\n" + texte
 
        smtp = smtplib.SMTP('smtp.gmail.com') 
        smtp.set_debuglevel(1) 
        smtp.ehlo() 
        smtp.starttls() 
        smtp.ehlo() 
        smtp.login(src, password) 
        smtp.sendmail(src, destinataire, mail) 
        smtp.close()
    def emailFormatage(self,reponseSql,select):
        texte=""
                    
        liste=select.split( "from")
        select=liste[0]
        liste=select.split("select ")
        select=liste[1]
        liste=select.split(",")
        #entete
        for i in range(len(liste)):
            text=liste[i]
            select=text.split(".")
            texte+=select[1]+"\t"
        texte+="\n"
        #corp du texte
        for i in range(len(reponseSql)):
            for j in range(len(reponseSql[0])):
                texte+=str(reponseSql[0][j])+"\t\t"
            texte+="\n"
        return texte
        
         
#ajouter cette classe et enlever def Interroger table qu'il y avait avant
class NosThreads(object):
    def __init__(self,parent):
        self.parent = parent
        timer = OpThread.Manager()
        timer.add_operation(self.InterrogerBaseRegle,300)
    def InterrogerBaseRegle(self):
        mois= time.localtime()[1]#mois
        jour= time.localtime()[2]#jour du mois. Ex: 1 a 31
        joursem= time.localtime()[6]#jour entre 0 et 6 (0=lundi)
        jourSemaine=['Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi','Dimanche']
        tabMois=["Aucun","Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"] 
        if jour==1:
            monsql="select id,requete,quoifaire from reglesaffaires where joursemaine='"+jourSemaine[joursem]+"' or mois='"+tabMois[mois]+"'"
        else:
            monsql="select id,requete,quoifaire from reglesaffaires where joursemaine='"+jourSemaine[joursem]+"'"
        reponse=self.parent.comOracleQuery(monsql)
              
        for i in range(len(reponse)):
           if reponse[i][2]=="email":
               self.parent.preparerEmails(reponse[i])
    
server.register_instance(ControleurServeur())
fichierActif=file("dbMessages.txt","w")

#Demarrer la boucle du serveur
print "OK, serveur demarrer"
#timer = OpThread.Manager()
#timer.add_operation(InterrogerBaseRegle, 5)#un jour = 86400


server.serve_forever()

print "OK, serveur arreter"


